//:C10:ProxyDemo.cpp
// Simple demonstration of the Proxy pattern.
#include <iostream>
using namespace std;
class ProxyBase
{
public:
    virtual void f() = 0;
    virtual void g() = 0;
    virtual void h() = 0;
    virtual ~ProxyBase(){}
};

class Implementation : public ProxyBase
{
public:
    void f(){ cout << "Implementation.f()" << endl; }
    void g(){ cout << "Implementation.g()" << endl; }    
    void h(){ cout << "Implementation.h()" << endl; }
};

class Proxy : public ProxyBase
{
    ProxyBase* implementation;
public:
    Proxy() { implementation = new Implementation(); }    
    ~Proxy() { delete implementation; }
    // Forward calls to the implementation:
    void f() { implementation->f(); }
    void g() { implementation->g(); }
    void h() { implementation->h(); }
};

int main(void)
{
    Proxy p;
    p.f();
    p.g();
    p.h();
}
